const ws = require('ws')
const {Session} = require("./passport")
// 创建WebSocket服务端的对象, 绑定的端口号是9998

function WebSocket(port){
  // 在线人数
  this.online = 0
  this.wss = new ws.Server({port})
  this.clients = [] //所有连接用户
}

WebSocket.prototype.listen = function(){
  // 对客户端的连接事件进行监听
  // client:代表的是客户端的连接socket对象
  this.wss.on('connection', (client, req) => {
    // 在线人数+1
    this.online++
    console.log('有客户端连接成功了...')
    // 对客户端的连接对象进行message事件的监听
    // msg: 由客户端发给服务端的数据
    client.on('message',async msg => {
      try{
        let data = JSON.parse(msg)
        // 获取登录用户信息
        if(data.url == 'ws/login'){
          // token获取用户信息
          let redis =  new Session(data.swtuser)
          await redis.load()
          if(!redis.visitor){
            client.send(JSON.stringify({
              code:1004,
              meassage: 'token不存在或已过期'
            }))
            return 
          }

          // 将用户的连接对象添加到clients数组中
          client.user_id = redis.visitor.id
          // 如果this.clients数组中没有这个用户的连接对象，则添加
          if(!this.clients.find(item => item.user_id == redis.visitor.id)){
            this.clients.push(client)
          }
          client.send(JSON.stringify({
            code: 1000,
            data: redis.visitor
          }))
        }
        else if(data.url == 'ws/heartCheck'){
          client.send(JSON.stringify({
            code: 1000,
            data: 'heartCheck'
          }))
        }
        // 获取在线人数
        else if(data.url == 'ws/online' ){
          client.send(JSON.stringify({
            code: 1000,
            data: this.online
          }))
        }
        else{
          client.send(JSON.stringify({
            code:1004,
            meassage:'没有此url'
          }))
        }    
      }catch(e){
        client.send(JSON.stringify({
          code:1004,
          meassage:'数据必须是json格式'
        }))
      }
      
    })

    client.on('close', () => {
      // 在线人数-1
      this.online--
      console.log('客户端断开连接了...')
      // 将用户的连接对象从clients数组中删除
      this.clients.splice(this.clients.indexOf(client), 1)
    })
  })
}

// 单播
WebSocket.prototype.unicast = function(user_id,msg){
  // 该用户是否在线
  let client = this.clients.findIndex(item => item.user_id == user_id)
  if(client == -1){
    console.log();
    return  
  }
  this.clients[client].send(JSON.stringify(msg))
}

// 广播
WebSocket.prototype.broadcast = function(msg){
  this.wss.clients.forEach(client => {
    client.send(JSON.stringify(msg))
  })
}

// 获取ws在线人数
WebSocket.prototype.online= function (ctx) {
  return {
      user: ctx.ws.clients.length, //在线用户
      guest: ctx.ws.online-ctx.ws.clients.length //在线游客
  }
}

// 默认导出
module.exports = WebSocket